package com.siwei.mes.common.util;


import com.siwei.mes.common.annotation.AutoEnum;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Map;

/**
 * @program: mes-platform
 * @description:
 * @author: yangke
 * @create: 2024-01-04 23:06
 **/
@Slf4j
public class InterprectChineseUtils {

    /**
     * 通过注解将传入的实体翻译成中文的说明 实体中对应注解@AutoEnum
     *
     * @param t 需要将枚举翻译成中文说明的实体
     */
    public static void reflexEnum(Object t) {
        try {
            Class<?> clas = t.getClass();
            for (Field f : t.getClass().getDeclaredFields()) {
                Object value = null;
                // 对于private的属性，如果不解锁，那么将无法访问，会报错
                f.setAccessible(true);
                // 通过反射的字段获取实体中的值
                value = f.get(t);

                // 获取注解的信息
                AutoEnum anno2 = f.getAnnotation(AutoEnum.class);
                if (anno2 != null && value != null) {
                    // 注解的path
                    String path = anno2.path();
                    // 注解的fieldName
                    String fieldName = anno2.fieldName();
                    // 通过value过去枚举中对应的中文说明
                    String enumValues = InterprectChineseUtils.enumExplain(path, value.toString());
                    // 通过注解中写的fieldName，给需要赋值的字段赋值
                    Field fv = null;
                    if (!"".equals(fieldName)) {
                        fv = clas.getDeclaredField(fieldName);
                    } else {
                        fv = f;
                    }
                    // 对于private的属性，如果不解锁，那么将无法访问，会报错
                    fv.setAccessible(true);
                    fv.set(t, enumValues);
                }
            }
        } catch (Exception e) {
            log.error("翻译字典报错报错", e);
        }
    }


    /**
     * 通过枚举路径跟值获取对应的中文说明
     *
     * @param name 枚举的class路径
     * @param code 对应的枚举值
     * @return
     */
    public static String enumExplain(String name, String code) {
        try {
            Class<?> clazz = Class.forName(name);
            List<Map<String, Object>> list = EnumUtils.toMapList(clazz);
            for (Map<String, Object> map : list) {
                if (map.get("code").toString().equals(code)) {
                    return map.get("message").toString();
                }
            }
        } catch (Exception e) {
            log.error("翻译字典报错报错", e);
            return "";
        }
        return "";
    }
}
